package data;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Clase que gestiona la conexion con la BBDD
 * @author Fran
 */
public class ConexionBD {

    private AccessDB acceso;
    private Connection conexion;
    private Statement sentencia;
    private ResultSet resultado;
    
    /**
     * Constructor para instanciar la clase ConexionBD.
     */
    public ConexionBD() {
        acceso = new AccessDB();
    }

    /**
     * Método usado con los parámetros correspondientes para conectar con la 
     * BBDD según el driver indicado.
     */
    public String connect() {

        String sqlite_jdbd_driver = "com.mysql.jdbc.Driver";
        String prefix = "jdbc:" + "mysql:";
        String hostName = "//" + acceso.ip + ":" + acceso.port;
        String dbName = "/" + acceso.dbname;
        
        String driver = sqlite_jdbd_driver;
        String url = prefix + hostName + dbName;
        
        try{
            Class.forName(driver);
            conexion = DriverManager.getConnection(url, acceso.user, acceso.pass);
            return "Conectado a la BBDD!";
            
        }catch(ClassNotFoundException fnfe){
            return "Driver de BD no encontrado!";
        }catch(SQLException sqle){
            return "Datos de la BD incorrectos!";
        }
    }
    
    /**
     * Método para INSERTAR una sentencia SQL cualquiera
     * @param sentenciaSQL <b>String</b> con la sentencia SQL correspondiente
     * @return <b>boolean</b> según si la inserción ha sido correcta o no
     */
    public boolean insert(String sentenciaSQL){
        try {
            sentencia = conexion.createStatement();
            sentencia.executeUpdate(sentenciaSQL);
        } catch (SQLException ex) {
            Logger.getLogger(ConexionBD.class.getName()).log(Level.SEVERE, null, ex);
            return false;//return false para que vaya apuntando quienes no se insertan en la BBDD
        }
        return true;//return true para los que se inserten correctamente
    }
    
    /**
     * Método para MOSTRAR un resultado o conjunto de resultados
     * @param sentenciaSQL <b>String</b> con la sentencia SQL correspondiente
     * @return objeto <b>ResultSet</b> con el/los resultado/s de la consulta
     */
    public ResultSet select(String sentenciaSQL){
        try{
            sentencia = conexion.createStatement();
            resultado = sentencia.executeQuery(sentenciaSQL);
        } catch (SQLException ex) {
            Logger.getLogger(ConexionBD.class.getName()).log(Level.SEVERE, null, ex);
        }
        return resultado;
    }
    
    /**
     * Método para ACTUALIZAR una fila de alguna tabla de la BBDD
     * @param sentenciaSQL <b>String</b> con la sentencia SQL correspondiente
     */
    public void update(String sentenciaSQL){
        try{
            sentencia = conexion.createStatement();
            sentencia.executeUpdate(sentenciaSQL);
        } catch (SQLException ex) {
            Logger.getLogger(ConexionBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    /**
     * Método para ELIMINAR alguna fila de la tabla correspondiente
     * @param sentenciaSQL <b>String</b> con la sentencia SQL correspondiente
     */
    public void delete(String sentenciaSQL){
        try{
            sentencia = conexion.createStatement();
            sentencia.executeUpdate(sentenciaSQL);
        } catch (SQLException ex) {
            Logger.getLogger(ConexionBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
        
    /**
     * Método para cerrar la conexión con la BBDD a partir de los objetos 
     * de <b>Connection</b> y <b>Statement</b>. 
     */
    public void closeJustConnection(){
        try {
            conexion.close();
            sentencia.close();
        } catch (SQLException ex) {
            System.err.println("No se ha utilizado la BD!");
        }
    }
    
    /**
     * Método para cerrar las conexiones con la BBDD a partir de los objetos
     * de <b>Connection</b>, <b>Statement</b> y <b>ResultSet</b>.
     */
    public void closeAll(){
        try {
            conexion.close();
            sentencia.close();
            resultado.close();
        } catch (SQLException ex) {
            System.err.println("No se ha utilizado la BD!");
        }
    }
}
